package com.lz.gmall.rabbit.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @author 郭运龙
 */
@Configuration
@Slf4j
public class RabbitMqConfiguration {

    @Bean
    public RabbitTemplate getRabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

        // 设置生产者确认机制的回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack){
                    //说明到达了交换机
                    log.info("消息正常发给了交换机...");
                }else {
                    //TODO:没有到达交换机，把消息写入数据库
                    log.info("消息没有正常发给了交换机...");
                }
            }
        });
        
        rabbitTemplate.setMandatory(true);
        // 设置生产者回退机制的回调
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                log.info("消息正常发给了交换机...,但是没有正常投递给队列...{}" , routingKey);
            }
        });

        return rabbitTemplate;
    }
//    @Autowired
//    private RabbitTemplate rabbitTemplate;
//
//        @PostConstruct
//        //@PreDestroy，相当于init-method，是我们自定义的方法，bean生命周期第三步
//        // <bean id="" class="类的全路径" init-method="" destroy-method=""/>
//        public void init(){
//
//            /*rabbitTemplate.setConfirmCallback(new  .ConfirmCallback() {
//                @Override
//                public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//
//                }
//            });*/
//            rabbitTemplate.setConfirmCallback(( CorrelationData correlationData, boolean ack,  String cause)->{
//                if (ack){
//                    System.out.println("已经到达了交换机");
//                }else {
//                    System.out.println("没有到达交换机，原因是"+cause);
//                }
//            });
//
//            rabbitTemplate.setReturnCallback((Message message, int replyCode, String replyText, String exchange, String routingKey)->{
//                log.error("消息没有到达队列。交换机：{}，路由键：{}，消息内容：{}，状态码：{}，状态文本：{}",
//                        exchange, routingKey, new String(message.getBody()), replyCode, replyText);
//            });
//        }
}
